package br.com.velp.sudecap.entidade;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.*;
import org.apache.commons.lang.StringUtils;
import org.hibernate.annotations.Cascade;

/**
 * <sumario> <objetivo> "Rastreabilidade" </objetivo> <autor> EDUARDO SANTOS DE
 * OLIVEIRA </autor> <versao>1.0.0.0</versao> <data_criacao> 17.10.2012
 * </data_criacao> <data_ultima_alteracao> N/A </data_ultima_alteracao>
 * <requisitos_afetados> RF006.01 - Listar Decretos / RF006.02 - Cadastrar
 * Decretos </requisitos_afetados> <descricao> Bean Responsável Pelo Mapeamento
 * da Tabela DECRETO </descricao> </sumario>
 */
@Entity
@Table(name = "Decreto")
public class Decreto extends EntityBase {

    public static final Long serialVersionUID = 1l;
    @Id
    @SequenceGenerator(name = "SQ_ID_DEC", sequenceName = "SQ_ID_DEC", allocationSize = 1)
    @GeneratedValue(generator = "SQ_ID_DEC")
    @Column(name = "id_Decreto", nullable = false, unique = true)
    private Long id;
    @Column(name = "Usu_cadastro")
    private Long idUsuarioCadastro;
    @Column(name = "Usu_alteracao")
    private Long idUsuarioAlteracao;
    @Column(name = "Numero", length = 10, nullable = false)
    private String numero;
    @Column(name = "Tipo_Decreto", length = 1)
    private String tipoDecreto;
    @Column(name = "Status", length = 1)
    private String status;
    @Column(name = "Ementa", length = 100, nullable = false)
    private String ementa;
    @Column(name = "Observacao", length = 4000)
    private String observacao;
    @Column(name = "Endereco_DOM", length = 500, nullable = false)
    private String enderecoDom;
    @Column(name = "Data_Publicacao", nullable = false)
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date dataPublicacao;
    @Column(name = "Data_Caducacao", nullable = false)
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date dataCaducacao;
    @Temporal(javax.persistence.TemporalType.TIMESTAMP)
    @Column(name = "Data_cadastro", nullable = false)
    private Date dataCadastro;
    @Temporal(javax.persistence.TemporalType.TIMESTAMP)
    @Column(name = "Data_alteracao")
    private Date dataAlteracao;
    @ManyToOne
    @JoinColumn(name = "Revogado_Decreto")
    private Decreto decretoRevogado;
    @OneToMany(mappedBy = "decretoOriginal", orphanRemoval = true)
    @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
    private List<Reratificacao> reratificacoes = new ArrayList<Reratificacao>();

    public Decreto() {
    }

    public Decreto(Long id) {
	this.id = id;
    }

    public Long getId() {
	return id;
    }

    public void setId(Long id) {
	this.id = id;
    }

    public Long getIdUsuarioAlteracao() {
	return idUsuarioAlteracao;
    }

    public void setIdUsuarioAlteracao(Long idUsuarioAlteracao) {
	this.idUsuarioAlteracao = idUsuarioAlteracao;
    }

    public Long getIdUsuarioCadastro() {
	return idUsuarioCadastro;
    }

    public void setIdUsuarioCadastro(Long idUsuarioCadastro) {
	this.idUsuarioCadastro = idUsuarioCadastro;
    }

    public String getNumero() {
	return numero;
    }

    public void setNumero(String numero) {
	this.numero = numero;
    }

    public String getEmenta() {
	return ementa;
    }

    public void setEmenta(String ementa) {
	this.ementa = ementa;
    }

    public String getEnderecoDom() {
	return enderecoDom;
    }

    public String getEnderecoDom30() {
	if (StringUtils.isNotBlank(getEnderecoDom())) {
	    if (getEnderecoDom().length() > 30) {
		return getEnderecoDom().substring(0, 30).concat("...");
	    } else {
		return getEnderecoDom();
	    }
	} else {
	    return getEnderecoDom();
	}
    }

    public void setEnderecoDom(String enderecoDom) {
	this.enderecoDom = enderecoDom;
    }

    public String getObservacao() {
	return observacao;
    }

    public void setObservacao(String observacao) {
	this.observacao = observacao;
    }

    public String getTipoDecreto() {
	return tipoDecreto;
    }

    public void setTipoDecreto(String tipoDecreto) {
	this.tipoDecreto = tipoDecreto;
    }

    public String getStatus() {
	return status;
    }

    public void setStatus(String status) {
	this.status = status;
    }

    public Date getDataCaducacao() {
	return dataCaducacao;
    }

    public void setDataCaducacao(Date dataCaducacao) {
	this.dataCaducacao = dataCaducacao;
    }

    public Date getDataAlteracao() {
	return dataAlteracao;
    }

    public void setDataAlteracao(Date dataAlteracao) {
	this.dataAlteracao = dataAlteracao;
    }

    public Date getDataCadastro() {
	return dataCadastro;
    }

    public void setDataCadastro(Date dataCadastro) {
	this.dataCadastro = dataCadastro;
    }

    public Date getDataPublicacao() {
	return dataPublicacao;
    }

    public void setDataPublicacao(Date dataPublicacao) {
	this.dataPublicacao = dataPublicacao;
    }

    public Decreto getDecretoRevogado() {
	return decretoRevogado;
    }

    public void setDecretoRevogado(Decreto decretoRevogado) {
	this.decretoRevogado = decretoRevogado;
    }

    public Long getIdDecretoRevogado() {
	return getDecretoRevogado() != null ? getDecretoRevogado().getId() : null;
    }

    public void setIdDecretoRevogado(Long idDecretoRevogado) {
	if (idDecretoRevogado != null) {
	    setDecretoRevogado(new Decreto(idDecretoRevogado));
	} else {
	    setDecretoRevogado(null);
	}
    }

    public List<Reratificacao> getReratificacoes() {
	return reratificacoes;
    }

    public void setReratificacoes(List<Reratificacao> reratificacoes) {
	this.reratificacoes = reratificacoes;
    }

    @Override
    public boolean equals(Object obj) {
	return genericEquals(obj);
    }

    @Override
    public int hashCode() {
	int hash = 7;
	hash = 83 * hash + (this.id != null ? this.id.hashCode() : 0);
	return hash;
    }
}
